/**
 * 给定字符串，再给定Q个询问：L R s
 * 问[L, R]区间内子序列为s的一共有多少个
 * s的长度保证为3
 * 
 * 令Diabc为S[1...i]区间内子序列abc的数量
 * Di00a表示a的数量
 * Di0ab表示子序列ab的数量
 * 则假设Si == c, 则
 * Di00c = D[i-1,0,0,c] + 1
 * Di0bc = D[i-1,0,0,b] + D[i-1,0,b,c], b从1到26
 * Diabc = D[i-1,0,a,b] + Dpi-1,a,b,c], a/b从1到26
 * 
 * 对每个询问O(1)即可
 * 答案 = D[Rabc] - D[L-1,a,b,c]
 *       - [L, R]中c的数量 * D[L-1,0,a,b]
 *       - [L, R]中bc的数量 * D[L-1,0,0,a]
 * 
 * 时间复杂度为O(26^2*N + Q)，尚可
 * 但空间复杂度在O(26^3 * N)，MLE。本代码只能过80%。
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<llt>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;

int N, Q;
string S;

vector<vvvi> D;

void init(){
	D.clear(); D.reserve(N + 1);
	D.emplace_back(vvvi(27, vvi(27, vi(27, 0))));

	for(int i=1;i<=N;++i){
        D.emplace_back(D.back());
		int c = S[i] - 'a' + 1;
		
		D[i][0][0][c] += 1;

		for(int b=1;b<=26;++b){
			D[i][0][b][c] += D[i-1][0][0][b];
		}

		for(int a=1;a<=26;++a)for(int b=1;b<=26;++b){
			D[i][a][b][c] += D[i - 1][0][a][b];
		}
	}

	return;
}

int L, R;
string T;

llt proc(){
	int a = T[0] - 'a' + 1;
	int b = T[1] - 'a' + 1;
	int c = T[2] - 'a' + 1;
	
	llt ans = D[R][a][b][c];
	ans -= D[L - 1][a][b][c];
	
	auto tmp = D[R][0][0][c] - D[L - 1][0][0][c];
	auto t2 = D[L - 1][0][a][b];
    ans -= tmp * t2;

    tmp *= D[L - 1][0][0][b];
	tmp = D[R][0][b][c] - D[L - 1][0][b][c] - tmp;
	t2 = D[L - 1][0][0][a];
	ans -= tmp * t2;

	return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> N >> Q;
	cin >> S;
	S = " " + S;
    init();
	for(int q=1;q<=Q;++q){
        cin >> L >> R >> T;
		cout << proc() << "\n";
	}
    return 0;
}